package practicapoo.source;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.Iterator;
import javax.swing.JOptionPane;

public class ListadoPeaje {

    private ArrayList<RegistroInformacion> enTransito;
    private ArrayList<Multa> multados;
    private ArrayList<RegistroInformacion> historico;

    public ListadoPeaje() {
        this.enTransito = new ArrayList();

        this.historico = new ArrayList();
        this.multados = new ArrayList();
    }

    public void entradaPeaje(Camara camara, Vehiculo vehiculo) {
        RegistroInformacion registro = new RegistroInformacion(vehiculo, camara);
        this.enTransito.add(registro);

        //return registro;
    }

    public void salidaPeaje(Camara camara, RegistroInformacion registro) {
        registro.finTrayecto(camara, registro.getVehiculo());
        if (registro.getArrayMulta().isEmpty() == false) {
            this.multados.addAll(registro.getArrayMulta());
        }
        this.historico.add(registro);
        this.enTransito.remove(registro);
    }

    public ArrayList<String> buscarMatricula(ArrayList<RegistroInformacion> entrada, String busqueda) {
        ArrayList<String> salida = new ArrayList();
        for (int i = 0; i < entrada.size(); i++) {
            if (entrada.get(i).getVehiculo().getMatricula().equals(busqueda)) {
                salida.add(entrada.get(i).toString());
            }
        }
        return salida;
    }

    public RegistroInformacion obtenerRegistro(ArrayList<RegistroInformacion> entrada, String busqueda) {
        RegistroInformacion it = null;
        for (int i = 0; i < entrada.size(); i++) {
            if (entrada.get(i).getVehiculo().getMatricula().equals(busqueda)) {
                it = entrada.get(i);
                return it;
            }

        }
        return it;
    }

    public ArrayList<String> buscarMultaVM(String matricula) {
        ArrayList<Multa> temp = this.multados;
        String informacion = "";
        ArrayList<String> datos = new ArrayList();

        for (int i = 0; i < this.multados.size(); i++) {
            if (this.multados.get(i).isTipoMulta() == false) {
                if (this.multados.get(i).getVehiculo().getMatricula().equals(matricula)) {
                    datos.add(this.multados.get(i).toString());
                }
            }
        }
        return datos;
    }

    public ArrayList<String> buscarMultaPendientes(String matricula) {
        String informacion = "";
        ArrayList<String> datos = new ArrayList();

        for (int i = 0; i < this.multados.size(); i++) {
            if (this.multados.get(i).isPagada() == false) {
                informacion = this.multados.get(i).getVehiculo().getMatricula();
                if (informacion.equals(matricula)) {
                    datos.add("Multa ID: " + i + " " + this.multados.get(i).toString());
                }
            }
        }
        return datos;
    }

    public ArrayList<Multa> listaMultaP(String matricula) {
        ArrayList<Multa> temp = new ArrayList();
        for (int i = 0; i < this.multados.size(); i++) {
            if ((this.multados.get(i).isPagada() == true)
                    && (this.multados.get(i).getVehiculo().getMatricula().equals(matricula))) {
                temp.add(this.multados.get(i));
            }
        }
        return temp;
    }

    public ArrayList<Multa> listaNoMultaP(String matricula) {
        ArrayList<Multa> temp = new ArrayList();
        for (int i = 0; i < this.multados.size(); i++) {
            if ((this.multados.get(i).isPagada() == false)
                    && (this.multados.get(i).getVehiculo().getMatricula().equals(matricula))) {
                temp.add(this.multados.get(i));
            }
        }
        return temp;
    }

    public ArrayList<Multa> ordenarListas(String matricula) {
        ArrayList<Multa> pagadas = new ArrayList();
        ArrayList<Multa> pendientes = new ArrayList();
        pagadas = this.listaMultaP(matricula);
        pendientes = this.listaNoMultaP(matricula);
        Collections.sort(pagadas);
        Collections.sort(pendientes);
        pendientes = pendientes;
        ArrayList<Multa> suma = new ArrayList();
        suma.addAll(pagadas);
        suma.addAll(pendientes);
        return suma;
    }

    public ArrayList<String> aMultaToAString(ArrayList<Multa> entrada) {
        ArrayList<String> listaSalida = new ArrayList();
        for (int i = 0; i < entrada.size(); i++) {
            listaSalida.add(entrada.get(i).toString());
        }
        return listaSalida;
    }

    public ArrayList<String> buscarHistorialMultas(String matricula) {
        String informacion = "";
        ArrayList<String> datos = new ArrayList();

        for (int i = 0; i < this.multados.size(); i++) {

            informacion = this.multados.get(i).getVehiculo().getMatricula();
            if (informacion.equals(matricula)) {
                datos.add("Multa ID: " + i + " " + this.multados.get(i).toString());
            }

        }
        return datos;
    }

    public boolean obtenerMulta(int id, String matricula) {
        if (id < this.multados.size()) {
            if (this.multados.get(id).getVehiculo().getMatricula().equals(matricula)) {
                if (this.multados.get(id).isPagada() == false) {
                    return true;
                }
            } else {
                return false;
            }
            return false;
        }
        return false;
    }

    public void pagarMulta(int index) {
        this.multados.get(index).setPagada(true);
    }

    public ArrayList<String> historialVehiculo(String matricula) {
        ArrayList<String> salida = new ArrayList();
        String infotemp = "";
        for (int i = 0; i < this.historico.size(); i++) {
            if (this.historico.get(i).getVehiculo().getMatricula().equals(matricula)) {
                infotemp = this.historico.get(i).cadenaHistorico();
                salida.add(infotemp);
            }
        }
        return salida;
    }

    public ArrayList<String> historialPeaje(GregorianCalendar menor, GregorianCalendar mayor) {
        ArrayList<String> salida = new ArrayList();
        String infotemp = "";
        long bajo;
        long alto;
        long fbajo = menor.getTimeInMillis();
        long falto = mayor.getTimeInMillis();
        for (int i = 0; i < this.historico.size(); i++) {
            bajo = this.historico.get(i).getCamaraEntrada().getFechahora().getTimeInMillis();
            alto = this.historico.get(i).getCamaraEntrada().getFechahora().getTimeInMillis();
            if ((bajo > fbajo) && (alto < falto)) {
                infotemp = "Matrícula: " + this.historico.get(i).getVehiculo().getMatricula()
                        + " Tamaño: " + this.historico.get(i).getVehiculo().getTamaño()
                        + " " + this.historico.get(i).cadenaHistorico();
                salida.add(infotemp);
            }
        }
        return salida;
    }

    public ArrayList<String> historialMultas(GregorianCalendar menor, GregorianCalendar mayor) {
        ArrayList<String> salida = new ArrayList();
        String infotemp = "";
        long bajo;
        long alto;
        long fbajo = menor.getTimeInMillis();
        long falto = mayor.getTimeInMillis();
        for (int i = 0; i < this.multados.size(); i++) {
            bajo = this.multados.get(i).getFechahora().getTimeInMillis();
            alto = this.multados.get(i).getFechahora().getTimeInMillis();
            if ((bajo > fbajo) && (alto < falto)) {
                infotemp = this.multados.get(i).toString();
                salida.add(infotemp);
            }
        }
        return salida;
    }

    public ArrayList<String> listadoMultaVMedia(String matricula) {
        ArrayList<Multa> temp = this.multados;
        String informacion = "";
        ArrayList<String> datos = new ArrayList();
        Iterator<Multa> it = temp.iterator();
        while (it.hasNext()) {
            if (it.next().getVehiculo().getMatricula() == matricula) {
                if (it.next().isTipoMulta() == false) {
                    informacion = it.next().toString();
                    datos.add(informacion);
                }
            }
        }
        return datos;
    }

    public void guardar(File r) throws IOException {
        //guardar enTransito
        File ruta1 = new File(r + "/enTransito.dat");
        FileOutputStream fenTransito = new FileOutputStream(ruta1);
        ObjectOutputStream oEnTransito = new ObjectOutputStream(fenTransito);
        oEnTransito.writeObject(this.enTransito);

        //guardar multados
        File ruta2 = new File(r + "/multados.dat");
        FileOutputStream fmultados = new FileOutputStream(ruta2);
        ObjectOutputStream oMultados = new ObjectOutputStream(fmultados);
        oMultados.writeObject(this.multados);

        //guardar historico
        File ruta3 = new File(r + "/historico.dat");
        FileOutputStream fhistorico = new FileOutputStream(ruta3);
        ObjectOutputStream oHistorico = new ObjectOutputStream(fhistorico);
        oHistorico.writeObject(this.historico);

        oEnTransito.close();
        oMultados.close();
        oHistorico.close();
    }

    public void cargar(File r) throws IOException, ClassNotFoundException {
        //carga enTransito
        File ruta1 = new File(r + "/enTransito.dat");
        FileInputStream fenTransito = new FileInputStream(ruta1);
        ObjectInputStream oEnTransito = new ObjectInputStream(fenTransito);
        this.enTransito = (ArrayList<RegistroInformacion>) oEnTransito.readObject();
        //carga multados
        File ruta2 = new File(r + "/multados.dat");
        FileInputStream fmultados = new FileInputStream(ruta2);
        ObjectInputStream oMultados = new ObjectInputStream(fmultados);
        this.multados = (ArrayList<Multa>) oMultados.readObject();
        //cargar historico
        File ruta3 = new File(r + "/historico.dat");
        FileInputStream fhistorico = new FileInputStream(ruta3);
        ObjectInputStream oHistorico = new ObjectInputStream(fhistorico);
        this.historico = (ArrayList<RegistroInformacion>) oHistorico.readObject();

        oEnTransito.close();
        oMultados.close();
        oHistorico.close();
    }

    public void guardarTXT(File ru, ArrayList<String> lista1) throws IOException, ClassNotFoundException {
        File ruta = new File(ru + "/ListaGenerada.txt");
        String temporal = "";
        try {
            PrintWriter grabar = new PrintWriter(new BufferedWriter(new FileWriter(ruta)));
            for (int i = 0; i < lista1.size(); i++) {
                temporal = lista1.get(i);
                grabar.println(temporal);
            }
            grabar.close();
        } catch (IOException e) {
            System.err.println(e);
        }

    }

    public ArrayList<RegistroInformacion> getEnTransito() {
        return enTransito;
    }

    public ArrayList<Multa> getMultados() {
        return multados;
    }

    public ArrayList<RegistroInformacion> getHistorico() {
        return historico;
    }

    public void setEnTransito(ArrayList<RegistroInformacion> enTransito) {
        this.enTransito = enTransito;
    }

    public void setMultados(ArrayList<Multa> multados) {
        this.multados = multados;
    }

    public void setMultados(Multa multa) {
        this.multados.add(multa);
    }

    public void setHistorico(ArrayList<RegistroInformacion> historico) {
        this.historico = historico;
    }

    public void setEnTransito(RegistroInformacion registro) {
        this.enTransito.add(registro);
    }
}
